SQLServer アーキテクチャ クエリ実行
#SQLServer
参考:クエリ処理アーキテクチャ ガイド - SQL Server | Microsoft Learn
クエリ実行モード
SQLServerではクエリ実行モードというのが存在し、ユースケースによって利用モードを変えるといい。
1. 行モード
普通のOLTP系のユースケースで利用する一般的なモード。
2. バッチモード
大量データを読み取る必要があるユースケースで利用するモード。
行モード実行は OLTP シナリオで非常に効率的ですが、データ ウェアハウスのシナリオなど、大量のデータをスキャンするときは効率性が下がることがあります。
クエリの最適化
ユーザーが定義したSELECT文は、手続き型ではない。「ここのテーブルのこのデータが欲しい。やり方は任せます」という命令。
SQLServerは、この命令を実現するための効率的な方法を考える。
このことを「最適化」と呼ぶ。
可能性のある多数のプラン候補の中から実行プランを 1 つ選択する処理を最適化と呼びます。
そしてこの最適化を行うサブシステムのことを「オプティマイザ」と呼ぶ。
クエリ オプティマイザーはクエリの分析やプランの選択を行うため、オーバーヘッドが発生します。ただし、クエリ オプティマイザーが効率的な実行プランを選択すれば、このオーバーヘッドの数倍の負荷を削減することができます。
このオプティマイザには、クエリ文だけでなく、対象データベース・テーブルの定義やインデックス情報、統計情報も与えられる。
オプティマイザは最適化を行った後、実際の手続き内容を出力する。
この出力結果を「実行計画」と呼ぶ。
SQLServer公式では実行プランと呼ばれてるが、まあどっちでも意味は通るだろう。
用語統一のため、ここでは実行計画と呼び続ける。
実行計画のキャッシュ
SQLServerではクエリや何やらから実行計画を算出(コンパイル)するのだが、この実行計画をメモリキャッシュに保存しておくという仕組みがある。
このキャッシュのことをプランキャッシュと呼ぶ。SQLServer プランキャッシュ。
キャッシュされた実行計画はずっと保存されるわけではなく、コストに応じて自動で削除されることもある。
クエリ処理アーキテクチャ ガイド - SQL Server | Microsoft Learn「プランキャッシュから実行プランを削除する
」
実行プランは、格納しておくためのメモリがある間はプラン キャッシュに残ります。 メモリ負荷が存在する場合、SQL Server データベース エンジンはコストベースの手法を使用して、どの実行プランをプラン キャッシュから削除するかを判断します。 コストベースの判断をするために、SQL Server データベース エンジンは各実行プランの現在のコスト変数を以下のような要因に基づいて増減させます。
基本的なクエリ結果取得までの流れ
1. パーサーが SELECT ステートメントをスキャンし、キーワード、式、演算子、識別子などの論理単位に分解します。
2. 基になるデータを結果セットで必要な形式に変換する論理手順を記述するクエリ ツリーが構築されます。クエリ ツリーはシーケンス ツリーとも呼ばれます。
3. クエリ オプティマイザーでは、基になるテーブルにアクセスできるさまざまな方法が分析されます。 その後、使用するリソースが少なく、最も短時間で結果を返す一連の手順が選択されます。 クエリ ツリーが更新され、この一連の手順が正確に記録されます。 この最終的に得られた最適化済みのクエリ ツリーを実行プランと呼びます。
4. リレーショナル エンジンによって、実行プランの実行が開始されます。 リレーショナル エンジンは、ベース テーブルからのデータを必要とする手順を処理するときに、要求した行セットのデータを渡すようにストレージ エンジンに要求します。
5. リレーショナル エンジンでは、ストレージ エンジンから返されたデータが結果セット用に定義された形式に変換され、結果セットをクライアントに返します。